home *** CD-ROM | disk | FTP | other *** search
/ ADA Programming Guide / ADA Programming Guide.iso / adatutor / lrmrdr / chap07.doc < prev    next >
Text File  |  1996-01-30  |  37KB  |  887 lines

  1. >                                 7. Packages
  2.  
  3.  
  4.  
  5. Packages  are  one of the four forms of program unit, of which programs can
  6. be composed.  The other forms are  subprograms,  task  units,  and  generic
  7. units.
  8.  
  9.  
  10. Packages  allow  the specification of groups of logically related entities.
  11. In their simplest form packages specify pools of  common  object  and  type
  12. declarations.   More  generally,  packages can be used to specify groups of
  13. related entities including also subprograms that can be called from outside
  14. the package, while their inner workings remain concealed and protected from
  15. outside users.
  16.  
  17.  
  18. References:  generic unit 12, program unit 6, subprogram 6,  task  unit  9,
  19. type declaration 3.3.1
  20.  
  21. > 7.1  Package Structure
  22.  
  23.  
  24. A  package is generally provided in two parts:  a package specification and
  25. a package body.  Every package has a package  specification,  but  not  all
  26. packages have a package body.
  27.  
  28.  
  29.     package_declaration ::= package_specification;
  30.  
  31.     package_specification ::=
  32.         package identifier is
  33.           {basic_declarative_item}
  34.        [private
  35.           {basic_declarative_item}]
  36.         end [package_simple_name]
  37.  
  38.     package_body ::=
  39.         package body package_simple_name is
  40.            [declarative_part]
  41.        [begin
  42.             sequence_of_statements
  43.        [exception
  44.             exception_handler
  45.            {exception_handler}]]
  46.         end [package_simple_name];
  47.  
  48.  
  49. The  simple  name  at  the  start of a package body must repeat the package
  50. identifier.  Similarly if a simple name appears at the end of  the  package
  51. specification or body, it must repeat the package identifier.
  52.  
  53.  
  54. If  a subprogram declaration, a package declaration, a task declaration, or
  55. a  generic  declaration  is  a  declarative  item  of   a   given   package
  56. specification, then the body (if there is one) of the program unit declared
  57. by  the  declarative  item  must  itself  be  a  declarative  item  of  the
  58. declarative part of the body of the given package.
  59.  
  60. Notes:
  61.  
  62.  
  63. A simple form of package, specifying a pool of objects and types, does  not
  64. require  a  package  body.   One  of  the  possible uses of the sequence of
  65. statements of a package body is  to  initialize  such  objects.   For  each
  66. subprogram  declaration   there  must be a corresponding body (except for a
  67. subprogram written in another language, as explained in section 13.9).   If
  68. the  body  of  a  program  unit  is a body stub, then a separately compiled
  69. subunit containing the  corresponding  proper  body  is  required  for  the
  70. program  unit  (see  10.2).   A body is not a basic declarative item and so
  71. cannot appear in a package specification.
  72.  
  73.  
  74. A package  declaration  is  either  a  library  package  (see  10.2)  or  a
  75. declarative item declared within another program unit.
  76.  
  77.  
  78. References:   basic  declarative item 3.9, body stub 10.2, declarative item
  79. 3.9, declarative part 3.9,  exception  handler  11.2,  generic  body  12.2,
  80. generic  declaration  12.1,  identifier 2.3, library unit 10.1, object 3.2,
  81. package body 7.3, program unit 6, proper body 3.9, sequence  of  statements
  82. 5.1,  simple  name  4.1,  subprogram  body 6.3, subprogram declaration 6.1,
  83. subunit 10.2, task body 9.1, task declaration 9.1, type 3.3
  84.  
  85. > 7.2  Package Specifications and Declarations
  86.  
  87.  
  88. The first list of declarative items  of  a package specification is  called
  89. the  visible  part  of the package.  The optional list of declarative items
  90. after the reserved word private is called the private part of the  package.
  91.  
  92.  
  93. An  entity declared in the private part of a package is not visible outside
  94. the package itself  (a name denoting such an entity is only possible within
  95. the package).  In contrast, expanded names denoting  entities  declared  in
  96. the visible part can be used even outside the package;  furthermore, direct
  97. visibility  of  such  entities can be achieved by means of use clauses (see
  98. 4.1.3 and 8.4).
  99.  
  100.  
  101. The elaboration of a package declaration consists of the elaboration of its
  102. basic declarative items in the given order.
  103.  
  104. Notes:
  105.  
  106.  
  107. The visible part of a package contains all  the  information  that  another
  108. program  unit  is  able to know about the package.  A package consisting of
  109. only a package specification (that is, without a package body) can be  used
  110. to  represent a group of common constants or variables, or a common pool of
  111. objects and types, as in the examples below.
  112.  
  113.  
  114. Example of a package describing a group of common variables:
  115.  
  116.     package PLOTTING_DATA is
  117.        PEN_UP : BOOLEAN;
  118.        CONVERSION_FACTOR,
  119.        X_OFFSET, Y_OFFSET,
  120.        X_MIN,    Y_MIN,
  121.        X_MAX,    Y_MAX:   REAL;     --  see 3.5.7
  122.  
  123.        X_VALUE : array (1 .. 500) of REAL;
  124.        Y_VALUE : array (1 .. 500) of REAL;
  125.     end PLOTTING_DATA;
  126.  
  127.  
  128. Example of a package describing a common pool of objects and types:
  129.  
  130.     package WORK_DATA is
  131.        type DAY is (MON, TUE, WED, THU, FRI, SAT, SUN);
  132.        type HOURS_SPENT is delta 0.25 range 0.0 .. 24.0;
  133.        type TIME_TABLE  is array (DAY) of HOURS_SPENT;
  134.  
  135.        WORK_HOURS   : TIME_TABLE;
  136.        NORMAL_HOURS : constant TIME_TABLE :=
  137.                          (MON .. THU => 8.25, FRI => 7.0, SAT | SUN => 0.0);
  138.     end WORK_DATA;
  139.  
  140.  
  141. References:  basic declarative item 3.9, constant 3.2.1,  declarative  item
  142. 3.9, direct visibility 8.3, elaboration 3.9, expanded name 4.1.3, name 4.1,
  143. number  declaration  3.2.2,  object  declaration  3.2.1, package 7, package
  144. declaration 7.1, package identifier 7.1, package specification  7.1,  scope
  145. 8.2,  simple  name  4.1,  type  declaration 3.3.1, use clause 8.4, variable
  146. 3.2.1
  147.  
  148. > 7.3  Package Bodies
  149.  
  150.  
  151. In contrast to the entities declared in  the  visible  part  of  a  package
  152. specification,  the  entities declared in the package body are only visible
  153. within the package body itself.  As a consequence, a package with a package
  154. body can be used for the construction of a group of related subprograms  (a
  155. package  in  the usual sense), in which the logical operations available to
  156. the users are clearly isolated from the internal entities.
  157.  
  158.  
  159. For the elaboration of a  package  body,  its  declarative  part  is  first
  160. elaborated,  and its sequence of statements (if any) is then executed.  The
  161. optional  exception  handlers  at  the  end  of  a  package  body   service
  162. exceptions raised during the execution of the sequence of statements of the
  163. package body.
  164.  
  165. Notes:
  166.  
  167.  
  168. A  variable  declared  in the body of a package is only visible within this
  169. body and, consequently, its value can only be changed  within  the  package
  170. body.   In the absence of local tasks, the value of such a variable remains
  171. unchanged between calls issued from  outside  the  package  to  subprograms
  172. declared  in  the  visible  part.   The  properties  of such a variable are
  173. similar to those of an "own" variable of Algol 60.
  174.  
  175.  
  176. The elaboration of the body of a subprogram declared in the visible part of
  177. a package is caused by the elaboration of the body of the package.  Hence a
  178. call of such a subprogram by an outside program unit raises  the  exception
  179. PROGRAM_ERROR if the call takes place before the elaboration of the package
  180. body (see 3.9).
  181.  
  182.  
  183. Example of a package:
  184.  
  185.     package RATIONAL_NUMBERS is
  186.  
  187.        type RATIONAL is
  188.           record
  189.              NUMERATOR   : INTEGER;
  190.              DENOMINATOR : POSITIVE;
  191.           end record;
  192.  
  193.        function EQUAL(X,Y : RATIONAL) return BOOLEAN;
  194.  
  195.        function "/"  (X,Y : INTEGER)  return RATIONAL;  --  to construct a rational number
  196.  
  197.        function "+"  (X,Y : RATIONAL) return RATIONAL;
  198.        function "-"  (X,Y : RATIONAL) return RATIONAL;
  199.        function "*"  (X,Y : RATIONAL) return RATIONAL;
  200.        function "/"  (X,Y : RATIONAL) return RATIONAL;
  201.     end;
  202.  
  203.     package body RATIONAL_NUMBERS is
  204.  
  205.        procedure SAME_DENOMINATOR (X,Y : in out RATIONAL) is
  206.        begin
  207.           --  reduces X and Y to the same denominator:
  208.           ...
  209.        end;
  210.  
  211.        function EQUAL(X,Y : RATIONAL) return BOOLEAN is
  212.           U,V : RATIONAL;
  213.        begin
  214.           U := X;
  215.           V := Y;
  216.           SAME_DENOMINATOR (U,V);
  217.           return U.NUMERATOR = V.NUMERATOR;
  218.        end EQUAL;
  219.  
  220.        function "/" (X,Y : INTEGER) return RATIONAL is
  221.        begin
  222.           if Y > 0 then
  223.              return (NUMERATOR => X,  DENOMINATOR => Y);
  224.           else
  225.              return (NUMERATOR => -X, DENOMINATOR => -Y);
  226.           end if;
  227.        end "/";
  228.  
  229.        function "+" (X,Y : RATIONAL) return RATIONAL is ...  end "+";
  230.        function "-" (X,Y : RATIONAL) return RATIONAL is ...  end "-";
  231.        function "*" (X,Y : RATIONAL) return RATIONAL is ...  end "*";
  232.        function "/" (X,Y : RATIONAL) return RATIONAL is ...  end "/";
  233.  
  234.     end RATIONAL_NUMBERS;
  235.  
  236.  
  237. References:   declaration  3.1,  declarative part 3.9, elaboration 3.1 3.9,
  238. exception 11, exception handler 11.2, name 4.1, package specification  7.1,
  239. program  unit  6, program_error exception 11.1, sequence of statements 5.1,
  240. subprogram 6, variable 3.2.1, visible part 7.2
  241.  
  242. > 7.4  Private Type and Deferred Constant Declarations
  243.  
  244.  
  245. The declaration of a type as a private  type  in  the  visible  part  of  a
  246. package serves to separate the characteristics that can be used directly by
  247. outside  program  units  (that  is,  the  logical  properties)  from  other
  248. characteristics whose direct use is confined to the package (the details of
  249. the definition of the type itself).  Deferred constant declarations declare
  250. constants of private types.
  251.  
  252.  
  253.     private_type_declaration ::=
  254.        type identifier [discriminant_part] is [limited] private;
  255.  
  256.     deferred_constant_declaration ::=
  257.        identifier_list : constant type_mark;
  258.  
  259.  
  260. A private type declaration is only  allowed as a declarative  item  of  the
  261. visible  part  of  a package, or as the generic parameter declaration for a
  262. generic formal type in a generic formal part.
  263.  
  264.  
  265. The type mark of a deferred constant declaration must denote a private type
  266. or a subtype of a private type;  a deferred constant  declaration  and  the
  267. declaration  of  the  corresponding  private  type must both be declarative
  268. items of the visible  part  of  the  same  package.   A  deferred  constant
  269. declaration  with several identifiers is equivalent to a sequence of single
  270. deferred constant declarations as explained in section 3.2.
  271.  
  272.  
  273. Examples of private type declarations:
  274.  
  275.     type KEY is private;
  276.     type FILE_NAME is limited private;
  277.  
  278.  
  279. Example of deferred constant declaration:
  280.  
  281.     NULL_KEY : constant KEY;
  282.  
  283.  
  284. References:   constant  3.2.1,  declaration  3.1,  declarative  item   3.9,
  285. deferred constant 7.4.3, discriminant part 3.7.1, generic formal part 12.1,
  286. generic  formal  type  12.1, generic parameter declaration 12.1, identifier
  287. 2.3, identifier list 3.2, limited  type  7.4.4,  package  7,  private  type
  288. 7.4.1, program unit 6, subtype 3.3, type 3.3, type mark 3.3.2, visible part
  289. 7.2
  290.  
  291. > 7.4.1  Private Types
  292.  
  293.  
  294. If  a  private  type declaration is given in the visible part of a package,
  295. then a corresponding declaration of a type with the  same  identifier  must
  296. appear  as  a  declarative  item  of  the private part of the package.  The
  297. corresponding declaration must be either a full  type  declaration  or  the
  298. declaration  of  a task type.  In the rest of this section explanations are
  299. given in terms of full type declarations;  the same  rules  apply  also  to
  300. declarations of task types.
  301.  
  302.  
  303. A  private  type  declaration  and  the corresponding full type declaration
  304. define a single type.  The private  type  declaration,  together  with  the
  305. visible  part,  define the operations that are available to outside program
  306. units (see section 7.4.2 on the operations that are available  for  private
  307. types).   On  the  other  hand,  the  full  type  declaration defines other
  308. operations whose direct use is only possible within the package itself.
  309.  
  310.  
  311. If the private type declaration includes  a  discriminant  part,  the  full
  312. declaration  must  include a discriminant part that conforms (see 6.3.1 for
  313. the conformance rules) and its  type  definition  must  be  a  record  type
  314. definition.  Conversely, if the private type declaration does not include a
  315. discriminant part, the type declared by the full type declaration (the full
  316. type)  must not be an unconstrained type with discriminants.  The full type
  317. must not be an unconstrained array type.  A limited type (in  particular  a
  318. task  type)  is allowed for the full type only if the reserved word limited
  319. appears in the private type declaration (see 7.4.4).
  320.  
  321.  
  322. Within the specification of the package that declares a  private  type  and
  323. before  the  end  of the corresponding full type declaration, a restriction
  324. applies to the use of a name that denotes the private type or a subtype  of
  325. the  private type and, likewise, to the use of a name that denotes any type
  326. or subtype that has a subcomponent of the private type.  The  only  allowed
  327. occurrences  of  such a name are in a deferred constant declaration, a type
  328. or  subtype  declaration,  a  subprogram   specification,   or   an   entry
  329. declaration;   moreover,  occurrences  within  derived  type definitions or
  330. within simple expressions are not allowed.
  331.  
  332.  
  333. The elaboration of a private type declaration creates a private  type.   If
  334. the  private  type  declaration  has  a discriminant part, this elaboration
  335. includes that of the discriminant part.  The elaboration of the  full  type
  336. declaration  consists  of  the  elaboration  of  the  type definition;  the
  337. discriminant  part,  if  any,  is  not  elaborated  (since  the  conforming
  338. discriminant  part  of  the  private  type  declaration  has  already  been
  339. elaborated).
  340.  
  341. Notes:
  342.  
  343.  
  344. It follows from the given rules that neither the declaration of a  variable
  345. of  a  private  type,  nor the creation by an allocator of an object of the
  346. private  type  are  allowed  before  the  full  declaration  of  the  type.
  347. Similarly  before the full declaration, the name of the private type cannot
  348. be used in a generic instantiation or in a representation clause.
  349.  
  350.  
  351. References:  allocator 4.8, array type 3.6, conform 6.3.1, declarative item
  352. 3.9, deferred constant declaration 7.4.3, derived  type  3.4,  discriminant
  353. part  3.7.1,  elaboration  3.9, entry declaration 9.5, expression 4.4, full
  354. type  declaration  3.3.1,  generic  instantiation  12.3,  identifier   2.3,
  355. incomplete  type declaration 3.8.1, limited type 7.4.4, name 4.1, operation
  356. 3.3, package 7, package specification 7.1, private part 7.2,  private  type
  357. 7.4,   private   type   declaration   7.4,   record  type  definition  3.7,
  358. representation clause 13.1, reserved word 2.9, subcomponent 3.3, subprogram
  359. specification 6.1, subtype 3.3, subtype declaration 3.3.2, type  3.3,  type
  360. declaration  3.3.1,  type  definition  3.3.1, unconstrained array type 3.6,
  361. variable 3.2.1, visible part 7.2
  362.  
  363. > 7.4.2  Operations of a Private Type
  364.  
  365.  
  366. The operations that are implicitly declared by a private  type  declaration
  367. include  basic operations.  These are the operations involved in assignment
  368. (unless the reserved word limited appears in the  declaration),  membership
  369. tests,   selected   components  for  the  selection  of  any  discriminant,
  370. qualification, and explicit conversions.
  371.  
  372.  
  373. For a private type T, the basic  operations  also  include  the  attributes
  374. T'BASE  (see  3.3.3) and T'SIZE (see 13.7.2).  For an object A of a private
  375. type, the basic operations  include  the  attribute  A'CONSTRAINED  if  the
  376. private type has discriminants (see 3.7.4), and in any case, the attributes
  377. A'SIZE and A'ADDRESS (see 13.7.2).
  378.  
  379.  
  380. Finally,  the  operations implicitly declared by a private type declaration
  381. include the predefined comparison for equality and  inequality  unless  the
  382. reserved word limited appears in the private type declaration.
  383.  
  384.  
  385. The  above  operations,  together with subprograms that have a parameter or
  386. result of the private type and that are declared in the visible part of the
  387. package, are the only  operations  from  the  package  that  are  available
  388. outside the package for the private type.
  389.  
  390.  
  391. Within   the  package  that  declares  the  private  type,  the  additional
  392. operations implicitly declared  by  the  full  type  declaration  are  also
  393. available.    However,   the  redefinition  of  these  implicitly  declared
  394. operations is allowed within the same declarative region, including between
  395. the private type declaration and the corresponding  full  declaration.   An
  396. explicitly  declared subprogram hides an implicitly declared operation that
  397. has the same parameter and result type profile (this is  only  possible  if
  398. the  implicitly  declared operation is a derived subprogram or a predefined
  399. operator).
  400.  
  401.  
  402. If a composite type has subcomponents of a private  type  and  is  declared
  403. outside  the  package  that  declares the private type, then the operations
  404. that are implicitly declared by  the  declaration  of  the  composite  type
  405. include  all operations that only depend on the characteristics that result
  406. from the private type declaration alone.  (For example the  operator  <  is
  407. not included for a one-dimensional array type.)
  408.  
  409.  
  410. If  the  composite type is itself declared within the package that declares
  411. the private type (including within an inner package  or  generic  package),
  412. then  additional  operations that depend on the characteristics of the full
  413. type are implicitly declared, as required by the rules  applicable  to  the
  414. composite   type   (for   example   the   operator  <  is  declared  for  a
  415. one-dimensional array type if the full type is discrete).  These additional
  416. operations are  implicitly  declared  at  the  earliest  place  within  the
  417. immediate  scope of the composite type and after the full type declaration.
  418.  
  419.  
  420. The same rules apply to the operations that are implicitly declared for  an
  421. access  type  whose designated type is a private type or a type declared by
  422. an incomplete type declaration.
  423.  
  424.  
  425. For every private type or subtype T the following attribute is defined:
  426.  
  427.  
  428. T'CONSTRAINED Yields  the  value  FALSE  if  T  denotes  an   unconstrained
  429.               nonformal  private  type with discriminants;  also yields the
  430.               value FALSE if T denotes a generic formal private  type,  and
  431.               the associated actual subtype is either an unconstrained type
  432.               with  discriminants  or  an unconstrained array type;  yields
  433.               the value TRUE otherwise.  The value of this attribute is  of
  434.               the predefined type BOOLEAN.
  435.  
  436. Note:
  437.  
  438.  
  439. A  private  type  declaration  and  the corresponding full type declaration
  440. define two different views of one  and  the  same  type.   Outside  of  the
  441. defining  package  the characteristics of the type are those defined by the
  442. visible part.  Within these outside  program  units  the  type  is  just  a
  443. private  type  and  any language rule that applies only to another class of
  444. types does not apply.  The fact that the full declaration  might  implement
  445. the  private  type  with  a  type of a particular class (for example, as an
  446. array type) is only relevant within the package itself.
  447.  
  448.  
  449. The  consequences  of  this  actual  implementation  are,  however,   valid
  450. everywhere.   For  example:  any default initialization of components takes
  451. place;  the attribute SIZE provides  the  size  of  the  full  type;   task
  452. dependence rules still apply to components that are task objects.
  453.  
  454.  
  455. Example:
  456.  
  457.     package KEY_MANAGER is
  458.        type KEY is private;
  459.        NULL_KEY : constant KEY;
  460.        procedure GET_KEY(K : out KEY);
  461.        function "<" (X, Y : KEY) return BOOLEAN;
  462.     private
  463.        type KEY is new NATURAL;
  464.        NULL_KEY : constant KEY := 0;
  465.     end;
  466.  
  467.     package body KEY_MANAGER is
  468.        LAST_KEY : KEY := 0;
  469.        procedure GET_KEY(K : out KEY) is
  470.        begin
  471.           LAST_KEY := LAST_KEY + 1;
  472.           K := LAST_KEY;
  473.        end GET_KEY;
  474.  
  475.        function "<" (X, Y : KEY) return BOOLEAN is
  476.        begin
  477.           return INTEGER(X) < INTEGER(Y);
  478.        end "<";
  479.     end KEY_MANAGER;
  480.  
  481. Notes on the example:
  482.  
  483.  
  484. Outside of the package KEY_MANAGER, the operations available for objects of
  485. type KEY include assignment, the comparison for equality or inequality, the
  486. procedure  GET_KEY  and  the  operator  "<";   they  do  not  include other
  487. relational operators such as ">=", or arithmetic operators.
  488.  
  489.  
  490. The explicitly declared operator "<"  hides  the  predefined  operator  "<"
  491. implicitly  declared  by the full type declaration.  Within the body of the
  492. function, an explicit conversion  of  X  and  Y  to  the  type  INTEGER  is
  493. necessary  to  invoke  the  "<"  operator of this type.  Alternatively, the
  494. result of the function could be written as not (X >= Y), since the operator
  495. ">=" is not redefined.
  496.  
  497.  
  498. The value of the variable LAST_KEY, declared in the package  body,  remains
  499. unchanged  between  calls of the procedure GET_KEY.  (See also the Notes of
  500. section 7.3.)
  501.  
  502.  
  503. References:   assignment  5.2,  attribute  4.1.4,  basic  operation  3.3.3,
  504. component  3.3,  composite  type  3.3,  conversion  4.6,  declaration  3.1,
  505. declarative region 8.1, derived subprogram 3.4, derived type 3.4, dimension
  506. 3.6,  discriminant  3.3,  equality  4.5.2,  full  type  7.4.1,  full   type
  507. declaration  3.3.1,  hiding  8.3, immediate scope 8.2, implicit declaration
  508. 3.1, incomplete type declaration 3.8.1, membership test 4.5, operation 3.3,
  509. package  7,  parameter  of  a  subprogram  6.2,  predefined  function  8.6,
  510. predefined  operator  4.5,  private type 7.4, private type declaration 7.4,
  511. program unit  6,  qualification  4.7,  relational  operator  4.5,  selected
  512. component 4.1.3, subprogram 6, task dependence 9.4, visible part 7.2
  513.  
  514. > 7.4.3  Deferred Constants
  515.  
  516.  
  517. If  a  deferred  constant  declaration  is  given  in the visible part of a
  518. package then  a  constant  declaration  (that  is,  an  object  declaration
  519. declaring a constant object, with an explicit initialization) with the same
  520. identifier  must  appear  as  a declarative item of the private part of the
  521. package.   This object declaration is called the full  declaration  of  the
  522. deferred  constant.   The  type  mark  given  in  the full declaration must
  523. conform to that given in the deferred  constant  declaration  (see  6.3.1).
  524. Multiple  or  single declarations are allowed for the deferred and the full
  525. declarations, provided that the equivalent single declarations conform.
  526.  
  527.  
  528. Within the specification of the package that declares a  deferred  constant
  529. and before the end of the corresponding full declaration, the use of a name
  530. that  denotes  the  deferred  constant  is  only  allowed  in  the  default
  531. expression for a record component or for a  formal  parameter  (not  for  a
  532. generic formal parameter).
  533.  
  534.  
  535. The elaboration of a deferred constant declaration has no other effect.
  536.  
  537.  
  538. The  execution of a program is erroneous if it attempts to use the value of
  539. a deferred constant  before  the  elaboration  of  the  corresponding  full
  540. declaration.
  541.  
  542. Note:
  543.  
  544.  
  545. The  full declaration for a deferred constant that has a given private type
  546. must not appear before the corresponding full type declaration.  This is  a
  547. consequence of the rules defining the allowed uses of a name that denotes a
  548. private type (see 7.4.1).
  549.  
  550.  
  551. References:   conform  6.3.1,  constant declaration 3.2.1, declarative item
  552. 3.9, default expression for a discriminant 3.7.1,  deferred  constant  7.4,
  553. deferred  constant  declaration  7.4,  elaboration has no other effect 3.1,
  554. formal parameter 6.1, generic formal parameter 12.1 12.3,  identifier  2.3,
  555. object  declaration  3.2.1,  package  7, package specification 7.1, private
  556. part 7.2, record component 3.7, type mark 3.3.2, visible part 7.2
  557.  
  558. > 7.4.4  Limited Types
  559.  
  560.  
  561. A limited type is a type for which neither assignment  nor  the  predefined
  562. comparison for equality and inequality is implicitly declared.
  563.  
  564.  
  565. A private type declaration that includes the reserved word limited declares
  566. a  limited  type.   A  task  type is a limited type.  A type derived from a
  567. limited type is itself a  limited  type.   Finally,  a  composite  type  is
  568. limited if the type of any of its subcomponents is limited.
  569.  
  570.  
  571. The operations available for a private type that is limited are as given in
  572. section 7.4.2 for private types except for the absence of assignment and of
  573. a predefined comparison for equality and inequality.
  574.  
  575.  
  576. For  a  formal parameter whose type is limited and whose declaration occurs
  577. in an explicit subprogram declaration, the mode out is only allowed if this
  578. type is private and the subprogram declaration occurs  within  the  visible
  579. part  of  the  package  that declares the private type.  The same holds for
  580. formal  parameters  of  entry  declarations  and   of   generic   procedure
  581. declarations.   The corresponding full type must not be limited if the mode
  582. out is used for any such formal parameter.   Otherwise,  the  corresponding
  583. full  type  is  allowed  (but  not  required)  to  be  a  limited  type (in
  584. particular,  it  is  allowed  to  be  a  task  type).   If  the  full  type
  585. corresponding  to  a  limited  private  type  is  not  itself limited, then
  586. assignment for the type is available within the package, but  not  outside.
  587.  
  588.  
  589. The following are consequences of the rules for limited types:
  590.  
  591.  
  592.   -  An explicit initialization is not allowed in an object declaration  if
  593.      the type of the object is limited.
  594.  
  595.  
  596.   -  A default expression is not allowed in a component declaration if  the
  597.      type of the record component is limited.
  598.  
  599.  
  600.   -  An explicit initial value is  not  allowed  in  an  allocator  if  the
  601.      designated type is limited.
  602.  
  603.  
  604.   -  A generic formal parameter of mode in must not be of a  limited  type.
  605.  
  606. Notes:
  607.  
  608.  
  609. The above rules do not exclude  a default expression for a formal parameter
  610. of  a  limited  type;  they do not exclude a deferred constant of a limited
  611. type if the full type is  not  limited.   An  explicit  declaration  of  an
  612. equality operator is allowed for a limited type (see 6.7).
  613.  
  614.  
  615. Aggregates  are  not  available for a limited composite type (see 3.6.2 and
  616. 3.7.4).  Catenation is not available for a limited array type (see  3.6.2).
  617.  
  618.  
  619. Example:
  620.  
  621.     package I_O_PACKAGE is
  622.        type FILE_NAME is limited private;
  623.  
  624.        procedure OPEN (F : in out FILE_NAME);
  625.        procedure CLOSE(F : in out FILE_NAME);
  626.        procedure READ (F : in FILE_NAME; ITEM : out INTEGER);
  627.        procedure WRITE(F : in FILE_NAME; ITEM : in  INTEGER);
  628.     private
  629.        type FILE_NAME is
  630.           record
  631.              INTERNAL_NAME : INTEGER := 0;
  632.           end record;
  633.     end I_O_PACKAGE;
  634.  
  635.     package body I_O_PACKAGE is
  636.        LIMIT : constant := 200;
  637.        type FILE_DESCRIPTOR is record  ...  end record;
  638.        DIRECTORY : array (1 .. LIMIT) of FILE_DESCRIPTOR;
  639.        ...
  640.        procedure OPEN (F : in out FILE_NAME) is  ...  end;
  641.        procedure CLOSE(F : in out FILE_NAME) is  ...  end;
  642.        procedure READ (F : in FILE_NAME; ITEM : out INTEGER) is ... end;
  643.        procedure WRITE(F : in FILE_NAME; ITEM : in  INTEGER) is ... end;
  644.     begin
  645.        ...
  646.     end I_O_PACKAGE;
  647.  
  648. Notes on the example:
  649.  
  650.  
  651. In  the  example above, an outside subprogram making use of I_O_PACKAGE may
  652. obtain a file name by calling OPEN and later use it in calls  to  READ  and
  653. WRITE.  Thus, outside the package, a file name obtained from OPEN acts as a
  654. kind  of  password;   its internal properties (such as containing a numeric
  655. value) are  not  known  and  no  other  operations  (such  as  addition  or
  656. comparison of internal names) can be performed on a file name.
  657.  
  658.  
  659. This  example is characteristic of any case where complete control over the
  660. operations of a type is desired.  Such packages serve a dual purpose.  They
  661. prevent a user from making use of the internal structure of the type.  They
  662. also implement the notion of an  encapsulated  data  type  where  the  only
  663. operations on the type are those given in the package specification.
  664.  
  665.  
  666. References:   aggregate  4.3,  allocator  4.8,  assignment  5.2, catenation
  667. operator 4.5, component declaration 3.7, component type 3.3, composite type
  668. 3.3, default expression for a discriminant 3.7,  deferred  constant  7.4.3,
  669. derived type 3.4, designate 3.8, discriminant specification 3.7.1, equality
  670. 4.5.2,  formal parameter 6.1, full type 7.4.1, full type declaration 3.3.1,
  671. generic formal parameter 12.1 12.3, implicit declaration 3.1, initial value
  672. 3.2.1, mode 12.1.1,  object  3.2,  operation  3.3,  package  7,  predefined
  673. operator  4.5,  private  type  7.4,  private  type  declaration 7.4, record
  674. component 3.7, record type 3.7, relational operator 4.5, subcomponent  3.3,
  675. subprogram 6, task type 9.1 9.2, type 3.3
  676.  
  677. > 7.5  Example of a Table Management Package
  678.  
  679.  
  680. The  following  example  illustrates  the use of packages in providing high
  681. level procedures with a simple interface to the user.
  682.  
  683.  
  684. The problem is to define a  table  management  package  for  inserting  and
  685. retrieving  items.   The  items  are  inserted  into  the table as they are
  686. supplied.  Each inserted item has an order number.  The items are retrieved
  687. according to their order number, where  the  item  with  the  lowest  order
  688. number is retrieved first.
  689.  
  690.  
  691. From  the  user's  point  of view, the package is quite simple.  There is a
  692. type called ITEM designating table items, a procedure INSERT for  inserting
  693. items,  and  a  procedure  RETRIEVE  for obtaining the item with the lowest
  694. order number.  There is a special item NULL_ITEM that is returned when  the
  695. table  is  empty,  and an exception TABLE_FULL which is raised by INSERT if
  696. the table is already full.
  697.  
  698.  
  699. A sketch of such a package is given below.  Only the specification  of  the
  700. package is exposed to the user.
  701.  
  702.  
  703.     package TABLE_MANAGER is
  704.  
  705.        type ITEM is
  706.           record
  707.              ORDER_NUM : INTEGER;
  708.              ITEM_CODE : INTEGER;
  709.              QUANTITY  : INTEGER;
  710.              ITEM_TYPE : CHARACTER;
  711.           end record;
  712.  
  713.        NULL_ITEM : constant ITEM :=
  714.           (ORDER_NUM | ITEM_CODE | QUANTITY => 0, ITEM_TYPE => ' ');
  715.  
  716.        procedure INSERT  (NEW_ITEM   : in  ITEM);
  717.        procedure RETRIEVE(FIRST_ITEM : out ITEM);
  718.  
  719.        TABLE_FULL : exception;  --  raised by INSERT when table full
  720.     end;
  721.  
  722.  
  723. The  details  of  implementing such packages can be quite complex;  in this
  724. case they involve a two-way  linked  table  of  internal  items.   A  local
  725. housekeeping  procedure  EXCHANGE  is used to move an internal item between
  726. the busy and the free lists.  The initial table linkages are established by
  727. the initialization part.  The package body need not be shown to  the  users
  728. of the package.
  729.  
  730.  
  731.     package body TABLE_MANAGER is
  732.        SIZE : constant := 2000;
  733.        subtype INDEX is INTEGER range 0 .. SIZE;
  734.  
  735.        type INTERNAL_ITEM is
  736.           record
  737.              CONTENT : ITEM;
  738.              SUCC    : INDEX;
  739.              PRED    : INDEX;
  740.           end record;
  741.  
  742.        TABLE : array (INDEX) of INTERNAL_ITEM;
  743.        FIRST_BUSY_ITEM : INDEX := 0;
  744.        FIRST_FREE_ITEM : INDEX := 1;
  745.  
  746.        function FREE_LIST_EMPTY return BOOLEAN is ... end;
  747.        function BUSY_LIST_EMPTY return BOOLEAN is ... end;
  748.        procedure EXCHANGE (FROM : in INDEX; TO : in INDEX) is ... end;
  749.  
  750.        procedure INSERT (NEW_ITEM : in ITEM) is
  751.        begin
  752.           if FREE_LIST_EMPTY then
  753.              raise TABLE_FULL;
  754.           end if;
  755.           --  remaining code for INSERT
  756.        end INSERT;
  757.  
  758.        procedure RETRIEVE (FIRST_ITEM : out ITEM) is ... end;
  759.  
  760.     begin
  761.        --  initialization of the table linkages
  762.     end TABLE_MANAGER;
  763.  
  764. > 7.6  Example of a Text Handling Package
  765.  
  766.  
  767. This  example  illustrates  a simple text handling package.  The users only
  768. have access to the visible part;  the implementation is hidden from them in
  769. the private part and the package body (not shown).
  770.  
  771.  
  772. From a user's point of view, a TEXT is a variable-length string.  Each text
  773. object has a maximum length,  which  must  be  given  when  the  object  is
  774. declared,  and  a  current  value, which is a string of some length between
  775. zero and the maximum.  The maximum possible length of a text object  is  an
  776. implementation-defined constant.
  777.  
  778.  
  779. The  package  defines first the necessary types, then functions that return
  780. some characteristics of objects of the type, then the conversion  functions
  781. between  texts  and  the predefined CHARACTER and STRING types, and finally
  782. some of the standard operations on varying strings.   Most  operations  are
  783. overloaded  on strings and characters as well as on the type TEXT, in order
  784. to minimize the number of explicit conversions the user has to write.
  785.  
  786.  
  787.     package TEXT_HANDLER is
  788.        MAXIMUM : constant := SOME_VALUE;  --  implementation-defined
  789.        subtype INDEX is INTEGER range 0 .. MAXIMUM;
  790.  
  791.        type TEXT(MAXIMUM_LENGTH : INDEX) is limited private;
  792.  
  793.        function LENGTH (T : TEXT) return INDEX;
  794.        function VALUE  (T : TEXT) return STRING;
  795.        function EMPTY  (T : TEXT) return BOOLEAN;
  796.  
  797.        function TO_TEXT (S : STRING;    MAX : INDEX) return TEXT;  --  maximum length MAX
  798.        function TO_TEXT (C : CHARACTER; MAX : INDEX) return TEXT;
  799.        function TO_TEXT (S : STRING)    return TEXT;  --  maximum length S'LENGTH
  800.        function TO_TEXT (C : CHARACTER) return TEXT;
  801.  
  802.        function "&" (LEFT : TEXT;      RIGHT : TEXT)      return TEXT;
  803.        function "&" (LEFT : TEXT;      RIGHT : STRING)    return TEXT;
  804.        function "&" (LEFT : STRING;    RIGHT : TEXT)      return TEXT;
  805.        function "&" (LEFT : TEXT;      RIGHT : CHARACTER) return TEXT;
  806.        function "&" (LEFT : CHARACTER; RIGHT : TEXT)      return TEXT;
  807.  
  808.        function "="  (LEFT : TEXT; RIGHT : TEXT) return BOOLEAN;
  809.        function "<"  (LEFT : TEXT; RIGHT : TEXT) return BOOLEAN;
  810.        function "<=" (LEFT : TEXT; RIGHT : TEXT) return BOOLEAN;
  811.        function ">"  (LEFT : TEXT; RIGHT : TEXT) return BOOLEAN;
  812.        function ">=" (LEFT : TEXT; RIGHT : TEXT) return BOOLEAN;
  813.  
  814.        procedure SET (OBJECT : in out TEXT; VALUE : in TEXT);
  815.        procedure SET (OBJECT : in out TEXT; VALUE : in STRING);
  816.        procedure SET (OBJECT : in out TEXT; VALUE : in CHARACTER);
  817.  
  818.        procedure APPEND (TAIL : in TEXT;      TO : in out TEXT);
  819.        procedure APPEND (TAIL : in STRING;    TO : in out TEXT);
  820.        procedure APPEND (TAIL : in CHARACTER; TO : in out TEXT);
  821.  
  822.        procedure AMEND (OBJECT : in out TEXT; BY : in TEXT;      POSITION : in INDEX);
  823.        procedure AMEND (OBJECT : in out TEXT; BY : in STRING;    POSITION : in INDEX);
  824.        procedure AMEND (OBJECT : in out TEXT; BY : in CHARACTER; POSITION : in INDEX);
  825.  
  826.        --  amend replaces part of the object by the given text, string, or character
  827.        --  starting at the given position in the object
  828.  
  829.        function LOCATE (FRAGMENT : TEXT;      WITHIN : TEXT) return INDEX;
  830.        function LOCATE (FRAGMENT : STRING;    WITHIN : TEXT) return INDEX;
  831.        function LOCATE (FRAGMENT : CHARACTER; WITHIN : TEXT) return INDEX;
  832.  
  833.        --  all return 0 if the fragment is not located
  834.  
  835.     private
  836.        type TEXT(MAXIMUM_LENGTH : INDEX) is
  837.           record
  838.              POS   : INDEX := 0;
  839.              VALUE : STRING(1 .. MAXIMUM_LENGTH);
  840.           end record;
  841.     end TEXT_HANDLER;
  842.  
  843.  
  844. Example of use of the text handling package:
  845.  
  846.  
  847. A program opens an output file, whose name is supplied by the string  NAME.
  848. This string has the form
  849.  
  850.     [DEVICE :] [FILENAME [.EXTENSION]]
  851.  
  852.  
  853. There  are  standard  defaults  for  device,  filename, and extension.  The
  854. user-supplied name is passed to EXPAND_FILE_NAME as a  parameter,  and  the
  855. result is the expanded version, with any necessary defaults added.
  856.  
  857.  
  858.     function EXPAND_FILE_NAME (NAME : STRING) return STRING is
  859.        use TEXT_HANDLER;
  860.  
  861.        DEFAULT_DEVICE    : constant STRING := "SY:";
  862.        DEFAULT_FILE_NAME : constant STRING := "RESULTS";
  863.        DEFAULT_EXTENSION : constant STRING := ".DAT";
  864.  
  865.        MAXIMUM_FILE_NAME_LENGTH : constant INDEX := SOME_APPROPRIATE_VALUE;
  866.        FILE_NAME : TEXT(MAXIMUM_FILE_NAME_LENGTH);
  867.  
  868.     begin
  869.  
  870.        SET(FILE_NAME, NAME);
  871.  
  872.        if EMPTY(FILE_NAME) then
  873.           SET(FILE_NAME, DEFAULT_FILE_NAME);
  874.        end if;
  875.  
  876.        if LOCATE(':', FILE_NAME) = 0 then
  877.           SET(FILE_NAME, DEFAULT_DEVICE & FILE_NAME);
  878.        end if;
  879.  
  880.        if LOCATE('.', FILE_NAME) = 0 then
  881.           APPEND(DEFAULT_EXTENSION, TO => FILE_NAME);
  882.        end if;
  883.  
  884.        return VALUE(FILE_NAME);
  885.  
  886.     end EXPAND_FILE_NAME;
  887.